package com.boot.myboot.myBean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @ConditionalOnClass ： classpath中存在该类时起效
 * @ConditionalOnMissingClass ： classpath中不存在该类时起效
 * @ConditionalOnBean ： DI容器中存在该类型Bean时起效
 * @ConditionalOnMissingBean ： DI容器中不存在该类型Bean时起效
 * @ConditionalOnSingleCandidate ： DI容器中该类型Bean只有一个或@Primary的只有一个时起效
 * @ConditionalOnExpression ： SpEL表达式结果为true时
 * @ConditionalOnProperty ： 参数设置或者值一致时起效
 * @ConditionalOnResource ： 指定的文件存在时起效
 * @ConditionalOnJndi ： 指定的JNDI存在时起效
 * @ConditionalOnJava ： 指定的Java版本存在时起效
 * @ConditionalOnWebApplication ： Web应用环境下起效
 * @ConditionalOnNotWebApplication ： 非Web应用环境下起效
 */
@Configuration
//为带有@ConfigurationProperties注解的Bean提供有效的支持。
// 这个注解可以提供一种方便的方式来将带有@ConfigurationProperties注解的类注入为Spring容器的Bean。
@EnableConfigurationProperties(MyProperties.class)//开启属性注入,通过@autowired注入
@ConditionalOnClass(User.class)//判断这个类是否在classpath中存在，如果存在，才会实例化一个Bean
// The Hello bean will be created if the hello.enable property exists and has a value other than false
// or the property doesn't exist at all.
@ConditionalOnProperty(prefix = "user", value = "enabled", matchIfMissing = true)
public class MyAutoConfiguration {
    @Autowired
    private MyProperties myProperties;

    @Bean
    @ConditionalOnMissingBean(User.class)//容器中如果没有User这个类,那么自动配置这个User
    public User user() {
        User user = new User();
        user.setUserName(myProperties.getMsg());
        return user;
    }

}

